Repository navigation
feat(macapp): remote workrooms in every build - #375
Conversation
Remote workrooms were Nightly and Dev only, and there only with the hidden remoteWorkroomsPreview setting, until #260's success criteria passed. The owner has lifted that gate: every build, stable included, now offers New Workroom's places (This Mac, local containers, boxd), opens and deletes remote workrooms, adopts their hosts at launch, and shows the Remote workrooms section in Settings. - Drop RemoteWorkrooms.isEnabled, its enabledForTesting seam, the remoteWorkroomsPreview key and the -WorkroomUITestRemotePreview fixture flag. - The row's "+" is always the places menu, so CreateRowButton loses its plain-button form. - Tests that turned the gate off now make the workroom unreachable the real ways: another build's host, or one still being created. The "turned off in this build" note and the preview-off UI test go. - Design docs and macapp/AGENTS.md say the gate is gone; As-built sections are left as the record they are. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With remote workrooms in every build, a stable release needs what a Nightly already has: - release.yml runs the host-image workflow under the release's tag and pins its digest into the DMG; release.sh refuses a Release build without one, as it already did a Nightly. Without it a stable app pulled the bare `workroom-host`, which Docker Hub refuses, so no container workroom could be created. - AgentBootstrap hands a remote host's agent off to the bundled one in every build. It followed the local hand-off's Nightly-only gate, so a stable host kept its first agent until the box restarted (the supervisor never lets it idle out) and quietly lost each newer build's services. The local hand-off stays gated. - Comments and design docs that still said remote workrooms were Nightly-only, or behind the preview, now say they are not. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… can't say Pre-landing review fixes for ungating remote workrooms. Codaset sign-in alone makes a remote place available, but every create first asked `gh repo view` which GitHub repository the project is, and that needs gh installed and signed in. A stable user signed in to Codaset without gh saw the place enabled, and every create failed with "Couldn't find its GitHub repository with gh." Now, when gh can't answer, the create reads the project's origin remote with git alone (`WorkroomStatusResolver.originRepository`). `GitHubRepository(remote:)` parses the https, scp-style (`git@host:owner/name`) and `ssh://` forms. gh still answers first, since it knows which remote is GitHub's. A non-GitHub origin still fails with its host named. Also corrects comments the ungating left false: TerminalTargetTests, SessionRestoreTests, `Workroom.remoteNote`, the `remote-host-image` make target and ci.yml's host-image step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8f8c51c8cc
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
🔵 Needs a closer look
It exposes remote provisioning and agent upgrades to stable before the real-provider criteria, while one restoration regression test no longer preserves host identity.
1 open finding
What changed in this PR
Enables remote workrooms in every macOS build and prepares stable releases to provision them safely.
Changes:
- Removes preview/channel gates across UI, restoration, routing, and host adoption.
- Pins stable releases to a tested multi-architecture host image and enables remote agent hand-off.
- Adds Git-origin fallback when
ghcannot resolve a repository.
| File | Description |
|---|---|
Makefile |
Updates host-image documentation. |
macapp/WorkroomAppUITests/NewWorkroomPlacesUITests.swift |
Tests always-visible place menus. |
macapp/WorkroomAppTests/WorkroomStatusResolverTests.swift |
Tests Git-origin resolution. |
macapp/WorkroomAppTests/TerminalTargetTests.swift |
Removes preview-gate expectations. |
macapp/WorkroomAppTests/SessionRestoreTests.swift |
Updates remote restoration fixtures. |
macapp/WorkroomAppTests/RemoteWorkroomRoutingTests.swift |
Removes test-only enablement. |
macapp/WorkroomAppTests/RemoteProvisioningIntegrationTests.swift |
Removes preview setup. |
macapp/WorkroomAppTests/RemoteHostsTests.swift |
Updates availability and ownership tests. |
macapp/WorkroomAppTests/GitHubRepositoryTests.swift |
Covers Git remote parsing. |
macapp/WorkroomAppTests/AppStoreDeleteRaceTests.swift |
Updates remote-create assertion. |
macapp/WorkroomApp/Views/SettingsView.swift |
Always shows remote settings. |
macapp/WorkroomApp/Views/ProjectSidebar.swift |
Always presents workroom places. |
macapp/WorkroomApp/Views/NewWorkroomDialog.swift |
Always asks where to create. |
macapp/WorkroomApp/Core/WorkroomStatusResolver.swift |
Resolves repositories from Git origin. |
macapp/WorkroomApp/Core/UITestFixture.swift |
Removes preview fixture configuration. |
macapp/WorkroomApp/Core/Session/AgentHandOff.swift |
Updates hand-off documentation. |
macapp/WorkroomApp/Core/Session/AgentBootstrap.swift |
Enables remote hand-off by default. |
macapp/WorkroomApp/Core/RemoteWorkrooms.swift |
Removes build/preview gating. |
macapp/WorkroomApp/Core/Models.swift |
Makes remote targets universally reachable. |
macapp/WorkroomApp/Core/GitHubRepository.swift |
Parses HTTPS and SSH remotes. |
macapp/WorkroomApp/Core/DefaultsKeys.swift |
Removes the preview preference. |
macapp/WorkroomApp/Core/AppStore.swift |
Always adopts hosts and adds origin fallback. |
macapp/Scripts/release.sh |
Requires pinned images for stable releases. |
macapp/AGENTS.md |
Updates settings architecture notes. |
docs/designs/remote-workrooms.md |
Records early stable rollout. |
docs/designs/oq8-cross-machine-reattach.md |
Updates rollout and hand-off status. |
.github/workflows/release.yml |
Builds and injects the stable host image. |
.github/workflows/host-image.yml |
Documents stable and Nightly consumers. |
.github/workflows/ci.yml |
Updates host-image comments. |
🧠 Review effort: Balanced
Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.
Codex: Debug builds now always bundle the Linux agents. Remote workrooms show in every build, so a Debug app that skipped them offered Docker, Apple Container and boxd and then failed every create with noBundledAgent. The WR_AGENT_LINUX opt-in is gone; CI's app job installs the musl targets and cargo-zigbuild. Measured locally: the first Debug build costs about 2 minutes more, later incremental builds no measurable extra. Copilot: the gated-restore test keeps one host ID across its creating and serving snapshots, so it models the same host becoming reachable rather than a replaced one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The local hand-off (#230) was gated to Nightly and Dev until Nightly had proven it. Turn it on for stable too, at the owner's request: a stable app now replaces a running older agent at launch, keeping every session, instead of leaving it to run until 30s after its last terminal closes. Remote hand-off has been on in every build since #375. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Remote workrooms are now fully usable in every build, stable included. This removes the Nightly/Dev gate and the hidden
remoteWorkroomsPreviewsetting. It ships ahead of #260's success criteria, which now verify after the fact.Behaviour changes
RemoteHosts.adoptruns on every reload in every build. A Mac that never made a container workroom has nothing recorded and nothing pending, so Docker is never touched.workroom-hostimage.release.ymlgains ahost-imagejob, the same one Nightly uses, andmacappneeds it.release.shrefuses a Release or Nightly build withoutWORKROOM_HOST_IMAGE@sha256.AgentHandOff.isEnabled).ghwhen Codaset is signed in. Whengh repo viewcan't answer, the create reads the project'soriginwith git alone. That covers https,git@host:owner/nameandssh://remotes. Before, a Codaset-only user saw the place enabled, and every create failed with "Couldn't find its GitHub repository with gh."Validation
make app-test(full suite): 3280 passed, 0 failed, 61 skipped.make app-lint,make actions-lintandmake app-test-scriptsare clean.GitHubRepository(remote:): every git remote form, plus refusals.WorkroomStatusResolver.originRepository./review:host-imagejob: 0 failures in the last 40 Nightly runs.Not checked
workroomCLI.createRemoteWorkroomhas no test of its own. The parser and the resolver are covered.Known and decided
host-imagefails, the DMG and appcast wait for a re-run. Nightly's sample shows no such failures.🤖 Generated with Claude Code